import { http } from './http'
import { PageQueryParams, PageResponse } from '@/config/page'

export interface DocUploadParams {
  parentId: number;

  name: string;

  size: number;

  url: string;
}

export interface DocMvParams {
  sources: number[];

  target: number;
}

export interface FileCreateParams {
  name: string;

  fileType: 'word' | 'excel' | 'ppt';
}

/**
 * 获取用户根目录下文档列表
 */
export function getUserRootDocs (params: PageQueryParams) {
  return http().get<PageResponse<any>>('/api/document/docs/query/user/root/docs', { params })
}

/**
 * 获取企业根目录下文档列表
 */
export function getEntRootDocs (entId: number, params: PageQueryParams) {
  return http().get<PageResponse<any>>(`/api/document/docs/query/ent/${entId}/docs`, { params })
}

/**
 * 获取用户指定目录下文档列表
 */
export function getUserDocs (params: PageQueryParams, parentId: number, nomsg?: boolean) {
  const headers = nomsg ? { nomsg: '1' } : undefined
  return http().get<PageResponse<any>>(`/api/document/docs/query/user/parent/${parentId}/docs`, { params, headers })
}

/**
 * 根据id获取文档
 */
export function getDocById (id: number) {
  return http().get<any>(`/api/document/docs/${id}`)
}

/**
 * 获取用户根目录
 */
export function getUserRootDoc () {
  return http().get<any>('/api/document/docs/get/user/root')
}

/**
 * 企业用户根目录
 */
export function getEntRootDoc (entId: number) {
  return http().get<any>(`/api/document/docs/get/ent/${entId}`)
}

/**
 * 在指定文件夹下创建文件夹
 */
export function mkdir (parentId: number, name: string) {
  return http().post<any>(`/api/document/docs/operate/mkdir/${parentId}/${encodeURIComponent(name)}`)
}

/**
 * 在指定文件夹下创建文件
 */
export function createFile (parentId: number, params: FileCreateParams) {
  return http().post<any>(`/api/document/docs/operate/create/${parentId}`, params)
}

/**
 * 根据文档路径获取文档
 */
export function getDocByPath (path: string) {
  return http().get<any>('/api/document/docs/get/path', { params: { path } })
}

/**
 * 判断文件名是否存在
 * @param parentId
 * @param name
 */
export function existsName (parentId: number, name: string): Promise<boolean> {
  return http().get<boolean>(`/api/document/docs/exists/${parentId}/${name}`)
}

/**
 * 在指定目录下上传文件。
 * @param params
 */
export function upload (params: DocUploadParams): Promise<number> {
  return http().post<number>('/api/document/docs/operate/upload', params, { timeout: 1000 * 60 * 30 })
}

/**
 * 删除指定目录。
 * @param params
 */
export function del (id: number): Promise<number> {
  return http().delete<number>(`/api/document/docs/operate/delete/${id}`)
}

/**
 * 批量删除文档。
 * @param params
 */
export function delInBatch (ids: number[]): Promise<any> {
  return http().post<any>('/api/document/docs/operate/batch/delete', { ids })
}

/**
 * 移动一个或多个文档到指定目录。
 * @param params
 */
export function mv (params: DocMvParams): Promise<number> {
  return http().post<number>('/api/document/docs/operate/mv', params)
}

/**
 * 复制一个或多个文档到指定目录。
 * @param params
 */
export function cp (params: DocMvParams): Promise<number> {
  return http().post<number>('/api/document/docs/operate/cp', params)
}

/**
 * 重命名文档。
 * @param params
 */
export function rename (id: number, name: string): Promise<number> {
  return http().post<number>(`/api/document/docs/operate/rename/${id}/${encodeURIComponent(name)}`)
}

/**
 * 下载文档。
 * @param params
 */
export function download (id: number, nomsg?: boolean): Promise<string> {
  const config = nomsg ? { headers: { nomsg: '1' }, timeout: 120 * 1000 } : { timeout: 120 * 1000 }
  return http().get<string>(`/api/document/docs/operate/download/${id}`, config)
}

/**
 * 下载文档。
 * @param params
 */
export function downloadWithPackage (ids: number[]): Promise<string> {
  return http().post<any>('/api/document/docs/operate/package/download', { ids }, { responseType: 'blob', timeout: 0 })
}

/**
 * 预览文档。
 * @param params
 */
export function preview (id: number): Promise<string> {
  return http().get<string>(`/api/document/docs/operate/preview/${id}`)
}

/**
 * 编辑文档。
 * @param params
 */
export function edit (id: number): Promise<string> {
  return http().get<string>(`/api/document/docs/operate/edit/${id}`)
}

/**
 * 打印文档。
 * @param params
 */
export function print (id: number): Promise<string> {
  return http().get<string>(`/api/document/docs/operate/print/${id}`)
}

/**
 * 发起文档发布流程。
 * @param params
 */
export function startPublishDocFlow (docId: number, auditUserId: number): Promise<string> {
  return http().post<string>(`/api/document/docs/${docId}/flow/publish/start`, {}, { params: { auditUserId } })
}

/**
 * 更新文档标签。
 * @param params
 */
export function updateTags (docId: number, tags: string[]): Promise<string> {
  return http().post<string>(`/api/document/docs/operate/${docId}/tags`, { tags })
}

/**
 * 更新文档备注。
 * @param params
 */
export function remark (docId: number, remark: string): Promise<string> {
  return http().post<string>(`/api/document/docs/operate/${docId}/remark`, { remark })
}

/**
 * 锁定文件。
 * @param params
 */
export function lock (docId: number, duration: number): Promise<any> {
  return http().post<any>(`/api/document/docs/operate/${docId}/lock/${duration}`)
}

/**
 * 解锁文件。
 * @param params
 */
export function unlock (docId: number): Promise<any> {
  return http().post<any>(`/api/document/docs/operate/${docId}/unlock`)
}

/**
 * 统计文件
 * @param params
 */
export function statsDoc (docId: number): Promise<any> {
  return http().get<any>(`/api/document/docs/${docId}/size`)
}

/**
 * 获取文档权限
 * @param docId
 */
export function getDocPermission (docId: number): Promise<any> {
  return http().get<any>(`/api/document/docs/${docId}/permission`)
}
